* (bug 68085) Links of the form [[localInterwikiPrefix:languageCode:pageTitle]],
where localInterwikiPrefix is a member of the $wgLocalInterwikis array, will
no longer be displayed in the sidebar when $wgInterwikiMagic is true.
+* New special page, MyLanguages, to redirect users to subpages with localised
+ versions of a page. (Integrated from Extension:Translate)
=== Bug fixes in 1.24 ===
* (bug 49116) Footer copyright notice is now always displayed in user language
'SpecialLog' => 'includes/specials/SpecialLog.php',
'SpecialMergeHistory' => 'includes/specials/SpecialMergeHistory.php',
'SpecialMycontributions' => 'includes/specials/SpecialMyRedirectPages.php',
+ 'SpecialMyLanguage' => 'includes/specials/SpecialMyLanguage.php',
'SpecialMypage' => 'includes/specials/SpecialMyRedirectPages.php',
'SpecialMytalk' => 'includes/specials/SpecialMyRedirectPages.php',
'SpecialMyuploads' => 'includes/specials/SpecialMyRedirectPages.php',
'Emailuser' => 'SpecialEmailUser',
'Movepage' => 'MovePageForm',
'Mycontributions' => 'SpecialMycontributions',
+ 'MyLanguage' => 'SpecialMyLanguage',
'Mypage' => 'SpecialMypage',
'Mytalk' => 'SpecialMytalk',
'Myuploads' => 'SpecialMyuploads',
--- /dev/null
+<?php
+/**
+ * Implements Special:MyLanguage
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Niklas Laxström
+ * @author Siebrand Mazeland
+ * @copyright Copyright © 2010-2013 Niklas Laxström, Siebrand Mazeland
+ */
+
+/**
+ * Unlisted special page just to redirect the user to the translated version of
+ * a page, if it exists.
+ *
+ * Usage: [[Special:MyLanguage/Page name|link text]]
+ *
+ * @since 1.24
+ * @ingroup SpecialPage
+ */
+class SpecialMyLanguage extends RedirectSpecialArticle {
+ public function __construct() {
+ parent::__construct( 'MyLanguage' );
+ }
+
+ /**
+ * If the special page is a redirect, then get the Title object it redirects to.
+ * False otherwise.
+ *
+ * @param string $par Subpage string
+ * @return Title|bool
+ */
+ public function getRedirect( $par ) {
+ $title = $this->findTitle( $par );
+ // Go to the main page if given invalid title.
+ if ( !$title ) {
+ $title = Title::newMainPage();
+ }
+ return $title;
+ }
+
+ /**
+ * Assuming the user's interface language is fi. Given input Page, it
+ * returns Page/fi if it exists, otherwise Page. Given input Page/de,
+ * it returns Page/fi if it exists, otherwise Page/de if it exists,
+ * otherwise Page.
+ *
+ * @param $par
+ * @return Title|null
+ */
+ public function findTitle( $par ) {
+ global $wgLanguageCode;
+ // base = title without language code suffix
+ // provided = the title as it was given
+ $base = $provided = Title::newFromText( $par );
+
+ if ( $base && strpos( $par, '/' ) !== false ) {
+ $pos = strrpos( $par, '/' );
+ $basepage = substr( $par, 0, $pos );
+ $code = substr( $par, $pos + 1 );
+ if ( Language::isKnownLanguageTag( $code ) ) {
+ $base = Title::newFromText( $basepage );
+ }
+ }
+
+ if ( !$base ) {
+ return null;
+ }
+
+ $uiCode = $this->getLanguage()->getCode();
+ $proposed = $base->getSubpage( $uiCode );
+ if ( $uiCode !== $wgLanguageCode && $proposed && $proposed->exists() ) {
+ return $proposed;
+ } elseif ( $provided && $provided->exists() ) {
+ return $provided;
+ } else {
+ return $base;
+ }
+ }
+}
'Mostrevisions' => array( 'MostRevisions' ),
'Movepage' => array( 'MovePage' ),
'Mycontributions' => array( 'MyContributions' ),
+ 'MyLanguage' => array( 'MyLanguage' ),
'Mypage' => array( 'MyPage' ),
'Mytalk' => array( 'MyTalk' ),
'Myuploads' => array( 'MyUploads', 'MyFiles' ),
) );
}
+ public function addDBData() {
+ $this->db->replace( 'interwiki', 'iw_prefix',
+ array(
+ 'iw_prefix' => 'externalwiki',
+ 'iw_url' => '//example.com/$1',
+ 'iw_api' => '//example.com/api.php',
+ 'iw_wikiid' => '',
+ 'iw_local' => 0,
+ 'iw_trans' => 0,
+ )
+ );
+ }
+
/**
* @covers Title::legalChars
*/
$title = Title::newFromText( $full );
$this->assertEquals( $fragment, $title->getFragment() );
}
+
+ /**
+ * @covers Title::isAlwaysKnown
+ * @dataProvider provideIsAlwaysKnown
+ * @param string $page
+ * @param bool $isKnown
+ */
+ public function testIsAlwaysKnown( $page, $isKnown ) {
+ $title = Title::newFromText( $page );
+ $this->assertEquals( $isKnown, $title->isAlwaysKnown() );
+ }
+
+ public function provideIsAlwaysKnown() {
+ return array(
+ array( 'Some nonexistent page', false ),
+ array( 'UTPage', false ),
+ array( '#test', true ),
+ array( 'Special:BlankPage', true ),
+ array( 'Special:SomeNonexistentSpecialPage', false ),
+ array( 'MediaWiki:Parentheses', true ),
+ array( 'MediaWiki:Some nonexistent message', false ),
+ array( 'externalwiki:Interwiki link', true ),
+ );
+ }
}
--- /dev/null
+<?php
+
+/**
+ * @group Database
+ * @covers SpecialMyLanguage
+ */
+class SpecialMyLanguageTest extends MediaWikiTestCase {
+ public function addDBData() {
+ $titles = array(
+ 'Page/Another',
+ 'Page/Another/ru',
+ );
+ foreach ( $titles as $title ) {
+ $page = WikiPage::factory( Title::newFromText( $title ) );
+ if ( $page->getId() == 0 ) {
+ $page->doEditContent(
+ new WikitextContent( 'UTContent' ),
+ 'UTPageSummary',
+ EDIT_NEW,
+ false,
+ User::newFromName( 'UTSysop' ) );
+ }
+ }
+ }
+
+ /**
+ * @covers SpecialMyLanguage::findTitle
+ * @dataProvider provideFindTitle
+ * @param $expected
+ * @param $subpage
+ * @param $langCode
+ * @param $userLang
+ */
+ public function testFindTitle( $expected, $subpage, $langCode, $userLang ) {
+ $this->setMwGlobals( 'wgLanguageCode', $langCode );
+ $special = new SpecialMyLanguage();
+ $special->getContext()->setLanguage( $userLang );
+ // Test with subpages both enabled and disabled
+ $this->mergeMwGlobalArrayValue( 'wgNamespacesWithSubpages', array( NS_MAIN => true ) );
+ $this->assertTitle( $expected, $special->findTitle( $subpage ) );
+ $this->mergeMwGlobalArrayValue( 'wgNamespacesWithSubpages', array( NS_MAIN => false ) );
+ $this->assertTitle( $expected, $special->findTitle( $subpage ) );
+ }
+
+ /**
+ * @param string $expected
+ * @param Title|null $title
+ */
+ private function assertTitle( $expected, $title ) {
+ if ( $title ) {
+ $title = $title->getPrefixedText();
+ }
+ $this->assertEquals( $expected, $title );
+ }
+
+ public function provideFindTitle() {
+ return array(
+ array( null, '::Fail', 'en', 'en' ),
+ array( 'Page/Another', 'Page/Another/en', 'en', 'en' ),
+ array( 'Page/Another', 'Page/Another', 'en', 'en' ),
+ array( 'Page/Another/ru', 'Page/Another', 'en', 'ru' ),
+ array( 'Page/Another', 'Page/Another', 'en', 'es' ),
+ );
+ }
+}
\ No newline at end of file